package 引出泛型.语法;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-24
 * Time: 17:15
 */
/*class MyArray1 {
    Object[] objects = new Object[10];
    public Object getObjects(int pos) {
        return objects[pos];
    }
    public void setObjects(int pos, Object obj) {
        this.objects[pos] = obj;
    }
}*/
class MyArray1 <T> {
    public T[] objects = (T[])new Object[10];//1
    public T getObjects(int pos) {
        return objects[pos];
    }
    public void setObjects(int pos, T obj) {
        this.objects[pos] = obj;
    }
}
public class Test1 {
    public static void main(String[] args) {
        MyArray1<String> myArray1 = new MyArray1<>();

        myArray1.setObjects(0, "hello");
        String ret = myArray1.getObjects(0);
        System.out.println(ret);

        System.out.println(myArray1.getObjects(0));
        System.out.println("=========");

        MyArray1<Integer> myArray11 = new MyArray1<>();//2
        myArray11.setObjects(1, 100);
        int ret1 = myArray11.getObjects(1);//3
        System.out.println(ret1);

        System.out.println(myArray11.getObjects(1));

        //myArray11.setObjects(2,"bit");//4
    }
    public static void main1(String[] args) {
        MyArray1 myArray1 = new MyArray1();
        myArray1.setObjects(0, 100);
        System.out.println(myArray1.getObjects(0));

        MyArray1 myArray2 = new MyArray1();
        myArray2.setObjects(0, "haha");
        System.out.println(myArray2.getObjects(0));
        myArray2.setObjects(1, "haha");
        String ret = (String) myArray2.getObjects(1);
    }
}
/*
代码解释：
1. 类名后的<T>代表占位符，表示当前类是一个泛型类
 了解： 【规范】类型形参一般使用一个大写字母表示，常用的名称有：
 - E表示Element
 - K表示Key
 - V表示Value
 - N表示Number
 - T表示Type
 - S, U, V 等等 - 第二、第三、第四个类型

2. 注释1处，不能new泛型类型的数组
意味着：
 T[] ts = new T[];//error
课件当中的代码：T[] array = (T[])new Object[10];是否就足够好，答案是未必的。这块问题一会儿介绍。

3. 注释2处，类型后加入<Integer>指定当前类型
4. 注释3处，不需要进行强制类型转换
5. 注释4处，代码编译报错，此时因为在注释2处指定类当前的类型，此时在注释4处，编译器会在存放元素的时候帮助我们进行校验检查。

 */
